merged patch from maemo-gtk which handles failed keynav correctly also
authorMichael Natterer <mitch@imendio.com>
Fri, 21 Sep 2007 14:29:08 +0000 (14:29 +0000)
committerMichael Natterer <mitch@src.gnome.org>
Fri, 21 Sep 2007 14:29:08 +0000 (14:29 +0000)
2007-09-21  Michael Natterer  <mitch@imendio.com>

* gtk/gtktextview.c (gtk_text_view_move_cursor_internal)
(gtk_text_view_move_viewport): merged patch from maemo-gtk which
handles failed keynav correctly also when the cursor is invisible.
(Tommi Komulainen)

svn path=/trunk/; revision=18851

gtk/gtktextview.c

index bceb8b640318549787b7febf04b8a3badbbde203..52fb5a74e5b9a191845a06813db9f78fbc7e77d2 100644 (file)
@@ -258,7 +258,7 @@ static void gtk_text_view_move_cursor       (GtkTextView           *text_view,
 static void gtk_text_view_page_horizontally (GtkTextView          *text_view,
                                              gint                  count,
                                              gboolean              extend_selection);
-static void gtk_text_view_move_viewport     (GtkTextView           *text_view,
+static gboolean gtk_text_view_move_viewport (GtkTextView           *text_view,
                                              GtkScrollStep          step,
                                              gint                   count);
 static void gtk_text_view_set_anchor       (GtkTextView           *text_view);
@@ -4872,8 +4872,10 @@ gtk_text_view_move_cursor_internal (GtkTextView     *text_view,
 
       switch (step) 
        {
-       case GTK_MOVEMENT_LOGICAL_POSITIONS:
         case GTK_MOVEMENT_VISUAL_POSITIONS:
+          leave_direction = count > 0 ? GTK_DIR_RIGHT : GTK_DIR_LEFT;
+          /* fall through */
+        case GTK_MOVEMENT_LOGICAL_POSITIONS:
         case GTK_MOVEMENT_WORDS:
          scroll_step = GTK_SCROLL_HORIZONTAL_STEPS;
          break;
@@ -4881,6 +4883,8 @@ gtk_text_view_move_cursor_internal (GtkTextView     *text_view,
          scroll_step = GTK_SCROLL_HORIZONTAL_ENDS;
          break;          
         case GTK_MOVEMENT_DISPLAY_LINES:
+          leave_direction = count > 0 ? GTK_DIR_DOWN : GTK_DIR_UP;
+          /* fall through */
         case GTK_MOVEMENT_PARAGRAPHS:
         case GTK_MOVEMENT_PARAGRAPH_ENDS:
          scroll_step = GTK_SCROLL_STEPS;
@@ -4898,8 +4902,16 @@ gtk_text_view_move_cursor_internal (GtkTextView     *text_view,
           scroll_step = GTK_SCROLL_PAGES;
           break;
        }
-      
-      gtk_text_view_move_viewport (text_view, scroll_step, count);
+
+      if (!gtk_text_view_move_viewport (text_view, scroll_step, count))
+        {
+          if (leave_direction != -1 &&
+              !gtk_widget_keynav_failed (GTK_WIDGET (text_view),
+                                         leave_direction))
+            {
+              g_signal_emit_by_name (text_view, "move-focus", leave_direction);
+            }
+        }
 
       return;
     }
@@ -5079,7 +5091,7 @@ gtk_text_view_page_horizontally (GtkTextView     *text_view,
 }
 
 
-static void
+static gboolean
 gtk_text_view_move_viewport (GtkTextView     *text_view,
                              GtkScrollStep    step,
                              gint             count)
@@ -5123,7 +5135,7 @@ gtk_text_view_move_viewport (GtkTextView     *text_view,
       break;
     }
 
-  set_adjustment_clamped (adjustment, adjustment->value + count * increment);
+  return set_adjustment_clamped (adjustment, adjustment->value + count * increment);
 }
 
 static void